/* eslint-disable @typescript-eslint/no-explicit-any */
/**
 * 函数防抖
 * 主要作用 防止点击事件，多次触发函数 合并为一个去执行
 * @template T
 * @template R
 * @param {(this: T, ...args: any[]) => R} fn
 * @param {number} [delay=100] 函数间隔执行时间
 * @param {number} [immediate=false] 是否立即执行
 * @returns
 */
export default function debounce<T, R = void>(fn: (this: T, ...args: any[]) => R, delay = 100, immediate = false) {
  let timer: number | null = null;
  return function (this: T, ...args: any[]) {
    const context = this;

    if (timer) window.clearTimeout(timer);
    if (immediate) {
      const callNow = !timer;
      timer = window.setTimeout(() => {
        timer = null;
      }, delay);
      if (callNow) fn.apply(context, args);
      return;
    }

    timer = window.setTimeout(() => {
      fn.apply(context, args);
    }, delay);
  };
}
